﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LGPeWJNM.MonteCarlo
{
    public class MonteCarlo:BaseClasses.IPMediana
    {
        private Random rnd { get; set; }

        public MonteCarlo()
        {
            rnd = new Random();
        }

        /// <summary>
        /// Método de designação por Gillet Johnson a partir de medianas geradas por Monte Carlo
        /// </summary>
        /// <param name="destinos">Conjuntos desordenado de coordenadas de destinos</param>
        /// <param name="deposito">Coordenadas do depósito</param>
        /// <param name="quantidadeVeiculos">Número de veículos disponíveis para a roteirização</param>
        /// <param name="capacidadeVeiculo">Capacidade de carga de cada veículo</param>
        /// <returns>Conjunto de grupos de clientes</returns>
        public IEnumerable<BaseClasses.Point> Processar(IEnumerable<BaseClasses.ICliente> destinos, int quantidadeVeiculos, float capacidadeVeiculo)
        {
            double xMin = destinos.Select(s => s.Coordenada.X).Min();
            double xMax = destinos.Select(s => s.Coordenada.X).Max();
            double yMin = destinos.Select(s => s.Coordenada.Y).Min();
            double yMax = destinos.Select(s => s.Coordenada.Y).Max();

            for (int i = 0; i < quantidadeVeiculos; i++)
            {
                yield return new BaseClasses.Point()
                {
                    X = rnd.NextDouble() * (xMax - xMin) + xMin,
                    Y = rnd.NextDouble() * (yMax - yMin) + yMin,
                };
            }
        }
    }
}
